
這次的內容是做出一個語音合成器,像是在google翻譯時可以選擇聽字詞的發音,基於這個功能增加暫停以及加快速度或提升音高的功能
作品實做
   const msg = new SpeechSynthesisUtterance(); //製作一個語音合成器
   msg.text = document.querySelector('[name="text"]').value;//設定一開始語音文本的內容
   const options = document.querySelectorAll('[type="range"], [name="text"]');
   const speakButton = document.querySelector("#speak"); //選取文字欄跟語速及音高的Dom元素
      
   function toggle(startOver = true) {
     speechSynthesis.cancel(); //先取消語音動作
     //如果startOver = true則語音文本內容
     if (startOver) {
          speechSynthesis.speak(msg); 
        }
      }
      
        function setOption() {
        console.log(this.name, this.value);
        msg[this.name] = this.value; //取得當下的值
        toggle(); //播放
      }
      
      speakButton.addEventListener("click", toggle);//當我點擊時撥放語音
       options.forEach((option) => option.addEventListener("change", setOption)); 
       //如果文字欄跟語速及音高發生調整
SpeechSynthesisUtterance()SpeechSynthesisUtteranc是 Web Speech API 的一部分,專門用於實現文本到語音的功能。這個物件包含了一個語音合成器朗讀的文本,可以定義的屬性有語音、音量、語速、音高、文本。
text 屬性指定要朗讀的字符串。voice 屬性來選擇合成語音的語音。volume 屬性設置音量,範圍是 0.0 到 1.0。rate 屬性設置語速,範圍是 0.1 到 10.0。pitch 屬性設置音高,範圍是 0 到 2。 let voices = [];
 const voicesDropdown = document.querySelector('[name="voice"]');
 
 function populateVoices() {
        voices = this.getVoices(); //get語音合成器列表
        //篩選zh語系渲染選擇列
        voicesDropdown.innerHTML = voices
          .filter((voice) => voice.lang.includes("zh"))
          .map(
            (voice) =>
              `<option value="${voice.name}">${voice.name} (${voice.lang})</option>`
          )
          .join("");
      }
      
  function setVoice() {
       //mag.voice的值=語音列表裡裡與下拉選單相同的值
        msg.voice = voices.find((voice) => voice.name === this.value);
        toggle();
      }
 speechSynthesis.addEventListener("voiceschanged", populateVoices);
 //當首次加載頁面或當語音合成的聲音列表(voices)發生變化時會觸發。
 voicesDropdown.addEventListener("change", setVoice); 
 //當偵測到下拉選單改變聲音合成器的時候執行
 const stopButton = document.querySelector("#stop");
 stopButton.addEventListener("click", () => toggle(false)); //當點擊時停止播放
[ Alex 宅幹嘛 ] 👨💻 深入淺出 Javascript30 快速導覽 | Day 23:Speech Synthesis
JS30